package org.nerve.study.test;

import cn.edu.hfut.dmic.webcollector.crawler.DeepCrawler;
import cn.edu.hfut.dmic.webcollector.model.Links;
import cn.edu.hfut.dmic.webcollector.model.Page;
import cn.edu.hfut.dmic.webcollector.util.RegexRule;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.jsoup.nodes.Document;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringReader;

/**
 * org.nerve.study.test
 * Created by zengxm on 2015/9/23 0023.
 */
public class OSChinaCrawler extends DeepCrawler {
	private String htmlSavePath;
	/*2.x版本中，爬虫的遍历由用户自定义(本质还是广度遍历，但是每个页面
	 生成的URL，也就是遍历树中每个节点的孩子节点，是由用户自定义的)。

	 1.x版本中，默认将每个页面中，所有满足正则约束的链接，都当作待爬取URL，通过
	 这种方法可以完成在一定范围内(例如整站)的爬取(根据正则约束)。

	 所以在2.x版本中，我们只要抽取页面中满足正则的URL，作为Links返回，就可以
	 完成1.x版本中BreadthCrawler的功能。

	 */
	RegexRule regexRule = new RegexRule();

	public OSChinaCrawler(String crawlPath, String htmlPath)throws Exception{
		super(crawlPath);

		this.htmlSavePath= htmlPath;
		File file=new File(htmlSavePath);
		System.out.println(file.getAbsolutePath());
		if(!file.exists()){
			System.out.println("创建目录" + file.getAbsolutePath());
			file.mkdirs();
		}

		regexRule.addRule("http://*.*oschina.net/.*");
		regexRule.addRule("-.*jpg.*");
	}

	@Override
	public Links visitAndGetNextLinks(Page page) {
		Document doc = page.getDoc();
		String title = doc.title();

		// System.out.println("URL:" + page.getUrl() + "  标题:" + title);
		//System.out.println(doc);
		String html=page.getHtml();
		if(!StringUtils.isEmpty(html))
		{
			String outputpath=htmlSavePath+File.separator+title+System.currentTimeMillis()+".html";

			System.out.println(outputpath);
			try {
				IOUtils.copy(new StringReader(html), new FileWriter(new File(outputpath)));
			} catch (IOException e) {
				e.printStackTrace();
			}


		}

        /*下面是2.0版本新加入的内容*/
        /*抽取page中的链接返回，这些链接会在下一轮爬取时被爬取。
         不用担心URL去重，爬虫会自动过滤重复URL。*/
		Links nextLinks = new Links();

        /*我们只希望抽取满足正则约束的URL，
         Links.addAllFromDocument为我们提供了相应的功能*/
		nextLinks.addAllFromDocument(doc, regexRule);

        /*Links类继承ArrayList<String>,可以使用add、addAll等方法自己添加URL
         如果当前页面的链接中，没有需要爬取的，可以return null
         例如如果你的爬取任务只是爬取seed列表中的所有链接，这种情况应该return null
         */
		return nextLinks;
	}

	public static void main(String[] s) throws Exception {
		 /*构造函数中的string,是爬虫的crawlPath，爬虫的爬取信息都存在crawlPath文件夹中,
          不同的爬虫请使用不同的crawlPath
        */
		OSChinaCrawler crawler = new OSChinaCrawler("F:\\download\\web-sprider\\crawlerOSC","F:\\download\\web-sprider\\163\\oschina");
		crawler.setThreads(100);
		crawler.addSeed("http://www.oschina.net/");
        /*设置是否断点爬取*/
		crawler.setResumable(false);
		crawler.start(6);
	}
}
